package com.jame.basics.string;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;


public class StringStudy {

    //定义用于测试的字符串
    private String str = "hello,world!";

    /**
     * 获取字符串长度
     * 结果:12
     */
    @Test
    public void test1() {
        System.out.println(str.length());
    }

    /**
     * 判断字符串是否相等
     * 结果:
     * str1是否等于str,equals方法:false
     * str2是否等于str,equals方法:true
     * str2是否等于str,==比较:true
     * str1是否等于str,根据编码:false
     * str2是否等于str,根据编码:true
     */
    @Test
    public void test6() {
        String str1 = "hello";
        String str2 = "hello,world!";
        System.out.println("str1是否等于str,equals方法:" + str1.equals(str));
        System.out.println("str2是否等于str,equals方法:" + str2.equals(str));
        //都在常量池,比较的是地址,所以相等
        System.out.println("str2是否等于str,==比较:" + (str2 == str));
        //根据ASCII编码判断
        System.out.println("str1是否等于str,根据编码:" + str1.equalsIgnoreCase(str));
        System.out.println("str2是否等于str,根据编码:" + str2.equalsIgnoreCase(str));
    }


    /**
     * 判断字符串等于空
     * 结果: 这是个空字符串
     * 这是个空字符串
     * 这是个空字符串
     */
    @Test
    public void test7() {
        String str = "";
        if (str.length() == 0) {
            System.out.println("这是个空字符串");
        }
        if (str.equals("")) {
            System.out.println("这是个空字符串");
        }
        //isEmpty也是判断字符串长度,如果等于0就为空
        if (str.isEmpty()) {
            System.out.println("这是个空字符串");
        }
        /*
            java11版本中有一个方法判断是否为空或空格
            blank(),如果是空或者是空格返回true
        */
    }


    /**
     * 获取字符串中第i个字符
     * 结果:w
     */
    @Test
    public void test2() {
        System.out.println(str.charAt(6));
    }

    /**
     * 截取一段字符存入数组中
     * srcBegin:开始下标
     * secEnd:结束下标
     * 第三参数:存入的数组
     * dstBegin:从数组的那个下标开始存
     * 结果:  hell
     * (前面有两个空格,因为最后一个值设置了开始存储位置为2)
     */
    @Test
    public void test3() {
        char chars[] = new char[80];
        str.getChars(0, 4, chars, 2);
        System.out.println(chars);
    }

    /**
     * 把一段字符根据某个字符拆分为一个数组
     * 有两个重载,一个直接写根据某个字符拆分,还有一个可以加拆分完的数组个数int类型
     * 结果:
     * a
     * b
     * c
     * d
     * e
     * 如果加第二个参数为2,意思就是把数组的元素拆成2个
     * 结果:
     * a
     * b#c#d#e
     */
    @Test
    public void test20() {
        String str1 = "a#b#c#d#e";
        String[] array = str1.split("#", 2);
        for (String s : array) {
            System.out.println(s);
        }
    }


    /**
     * 从一段字符串中截取一段
     * 结果:,world!====,wo
     */
    @Test
    public void test4() {
        //截取下标5以后的所有字符
        String substring1 = str.substring(5);
        //截取下标5和8之间的字符
        String substring2 = str.substring(5, 8);
        System.out.println(substring1 + "====" + substring2);
    }

    /**
     * 显示对应下标的ASCII编码
     * 结果:108
     */
    @Test
    public void test5() {
        System.out.println(str.codePointAt(3));
    }

    /**
     * 根据ASCII编码排序,判断两个字符串差距,小于返回负数,大于返回整数,相同返回0
     * 结果:-55
     */
    @Test
    public void test8() {
        String str1 = "@A";
        System.out.println(str1.compareTo("@x"));
    }

    /**
     * 判断一个字符串是否以prefix开头或者以suffix结尾,如果是返回true
     * 结果:true
     * true
     */
    @Test
    public void test9() {
        System.out.println(str.startsWith("h"));
        System.out.println(str.endsWith("!"));
    }

    /**
     * 参数
     * (String str) 从0下标开始,查找和str匹配的第一个相同字符的下标
     * (String str int fromIndex) 从fromIndex下标开始,查找和str匹配的第一个相同字符的下标
     * (int cp) 从0下标开始,查找和cp匹配的第一个相同字符的ASCII编码的下标
     * (int cp int fromIndex) 从fromIndex下标开始,查找和cp匹配的第一个相同字符的ASCII编码的下标
     * 如果没有找到返回-1
     * 结果:7
     */
    @Test
    public void test10() {
        System.out.println(str.indexOf("o", 5));
    }

    /**
     * 参数
     * (String str) 从最后的下标开始,查找和str匹配的最后一个相同字符的下标
     * (String str int fromIndex) 从fromIndex下标开始,查找和str匹配的最后一个相同字符的下标
     * (int cp) 从最后的下标开始,查找和cp匹配的最后一个相同字符的ASCII编码的下标
     * (int cp int fromIndex) 从fromIndex下标开始,查找和cp匹配的最后一个相同字符的ASCII编码的下标
     * 如果没有找到返回-1
     * 这个方法和test10()刚好相反,像反着查找
     * 结果:4
     */
    @Test
    public void test11() {
        System.out.println(str.lastIndexOf("o", 5));
    }

    /**
     * 替换字符串中所有匹配字符串
     * 返回一个新的字符串,第一个参数为需要替换的值,第二个参数为替换成什么,两个参数都可以为String类型或者Stringbuilder类型
     * 结果:hell6,w6rld!
     */
    @Test
    public void test12() {
        System.out.println(str.replace("o", "6"));
    }


    /**
     * 将字符串中所有字符转为大写或小写
     * 结果:hello,world!
     * HELLO,WORLD!
     */
    @Test
    public void test13() {

        System.out.println(str.toLowerCase());
        System.out.println(str.toUpperCase());
    }

    /**
     * 删除字符串开头的空格
     * 结果:happy 3
     */
    @Test
    public void test14() {
        String str1 = "    happy 3";
        System.out.println(str1.trim());
        /*
         * java11中多了一个strip()方法,用于删除字符串结尾的空格
         * */
    }

    /**
     * 拼接一个集合或数组中所有元素并添加连接符
     * 结果: lo*rt*yu
     * qw@er@ty
     */
    @Test
    public void test15() {
        List<String> arrayList = new ArrayList<String>();
        arrayList.add("lo");
        arrayList.add("rt");
        arrayList.add("yu");

        String[] array = new String[]{"qw", "er", "ty"};

        System.out.println(String.join("*", arrayList));
        System.out.println(String.join("@", array));
    }


    /**
     * 练习题1
     * 在"good morning"字符串中包含几个字母o
     */
    @Test
    public void test16() {
        String s = "good morning";
        //用来计数
        int sum = 0;
        //用来标记开始下标
        int index = 0;
        for (int i = 0; i < s.length(); i++) {
            int result = s.indexOf("o", index);
            if (result > 0) {
                index = result + 1;
                sum++;
            } else {
                break;
            }
        }
        System.out.println(sum);
    }

    /**
     * 练习题2
     * 字符串翻转,例如传入123,返回321
     */
    @Test
    public void test17() {
        String str = "123";
        String result = "";
        for (int i = str.length(); i > 0; i--) {
            result += str.charAt(i - 1);
        }
        System.out.println(result);
    }

    /**
     * 练习题3
     * 判断一个字符串是不是回文数
     */
    @Test
    public void test18() {
        String str = "1112222111";
        for (int i = 0; i < str.length() / 2; i++) {
            if (!(str.charAt(i) == str.charAt(str.length() - i - 1))) {
                System.out.println("这个不是回文");
                return;
            }
        }
        System.out.println("这个是回文");
    }

    /**
     * 练习题3
     * 判断一个字符串是不是回文数
     */
    @Test
    public void test18_2() {
        String str = "1112222111";
        String str2 = new StringBuffer(str).reverse().toString();
        for (int i = 0; i < str2.length() / 2; i++) {
            if (str.charAt(i) != str2.charAt(i)) {
                System.out.println("这个不是回文");
                return;
            }
        }
        System.out.println("这个是回文");
    }



    //字符串常量池
    @Test
    public void test19() {
        String s1 = "a";
        String s2 = "a";
        String s3 = "a";
        System.out.println((s1 == s2) + "=" + (s2 == s3));
        s3 = "b";
        System.out.println((s1 == s2) + "=" + (s2 == s3));
    }

    /**
     * 交换变量值不使用第三个变量-变量
     */
    @Test
    public void test21() {
        if("s".equals("")){

        }
        int a = 16, b = 2;
        System.out.println("交换前A:"+a+"===B:"+b);
        a += b;
        b = a - b;
        a -= b;
        System.out.println("交换后A:" + a + "===B:" + b);
    }

    /**
     * 交换变量不使用第三个变量-位运算
     * ^ 异或 两个操作数的位中，相同则结果为0，不同则结果为1
     */
    @Test
    public void test22(){
        //a=0011 b=10
        int a=3,b=2;
        /**
         * 结果简写r(result)
         * a 0011
         * b 0010
         * r 0001 十进制为1
         * a=3,b=1
         */
        b=a^b;
        /**
         * a 0011
         * b 0001
         * r 0010 十进制为2
         * a=2,b=1
         */
        a=a^b;
        /**
         * a 0010
         * b 0001
         * r 0011 十进制为3
         * a=2,b=3
         */
        b=a^b;
        System.out.println(a+"===="+b);

    }










    
}
